package edu.hut;

import java.util.ArrayList;
import java.util.List;
/**
 * 矩形类
 * @author GuoQian
 * @since 2024-11-14
 * @version 3.0
 */
public class Rectangle implements Polygon {

    List<Vertex> vertices;

    /**
     * Rectangle的构造函数，通过四个点构造一个矩形
     * @param v1 顶点1
     * @param v2 顶点2
     * @param v3 顶点3
     * @param v4 顶点4
     */
    public Rectangle(Vertex v1, Vertex v2, Vertex v3, Vertex v4) {
        vertices = new ArrayList<>();
        vertices.add(v1);
        vertices.add(v2);
        vertices.add(v3);
        vertices.add(v4);
    }

    /**
     * @return 如果可以构成矩形返回 true，否则返回 false。
     *此方法通过一系列计算和判断来确定给定的四个顶点是否能构成一个矩形。
     *具体步骤包括获取顶点、检查是否有重复顶点、计算各边和对角线的长度，
     *然后依据矩形的几何特性（对边相等且对角线相等）来判断是否构成矩形。
     */
    @Override
    public boolean canForm() {
        // 获取四个顶点
        Vertex v1 = vertices.get(0);
        Vertex v2 = vertices.get(1);
        Vertex v3 = vertices.get(2);
        Vertex v4 = vertices.get(3);

        if (checkForDuplicatePoints(v1, v2, v3, v4)) {
            return false;
        }

        // 计算四条边的长度
        float side1 = v1.calcDistance(v2);
        float side2 = v2.calcDistance(v3);
        float side3 = v3.calcDistance(v4);
        float side4 = v4.calcDistance(v1);

        // 计算两条对角线的长度
        float diagonal1 = v1.calcDistance(v3);
        float diagonal2 = v2.calcDistance(v4);

        // 判断四条边是否两两相等（对边相等）
        boolean sidesEqual = (side1 == side3) && (side2 == side4);

        // 判断两条对角线是否相等
        boolean diagonalsEqual = diagonal1 == diagonal2;

        // 只有四条边两两相等且两条对角线相等时，才是矩形
        return sidesEqual && diagonalsEqual;

    }

    /**
     * @return 矩形的面积
     * 该方法用于计算由给定的四个顶点所构成的矩形的面积。
     * 首先会获取四个顶点，然后检查这四个顶点是否能构成矩形，
     * 若能构成矩形，则通过计算相邻两边的长度并将它们相乘来得到矩形的面积；
     * 若不能构成矩形，则返回0。
     */
    @Override
    public float calcArea() {
        // 获取四个顶点
        Vertex v1 = vertices.get(0);
        Vertex v2 = vertices.get(1);
        Vertex v3 = vertices.get(2);
        Vertex v4 = vertices.get(3);

        if (!canForm()) {
            return 0;
        }

        // 计算相邻两边的长度，这里假设v1和v2相邻，v2和v3相邻
        float side1 = v1.calcDistance(v2);
        float side2 = v2.calcDistance(v3);

        // 矩形面积等于相邻两边长度的乘积
        return side1 * side2;
    }

    /**
     *重写的绘制方法，用于在控制台输出表示存在一个矩形的信息
     */
    @Override
    public void draw() {
        System.out.println("There is a rectangle");
    }

    /**
     * @return 任意两点重复则返回false 否则返回true
     * 判断是否存在重复的顶点
     */
    public boolean checkForDuplicatePoints(Vertex v1, Vertex v2, Vertex v3, Vertex v4) {
        return (v1.x == v2.x && v1.y == v2.y) ||
                (v1.x == v3.x && v1.y == v3.y) ||
                (v1.x == v4.x && v3.y == v4.y) ||
                (v2.x == v3.x && v2.y == v3.y) ||
                (v2.x == v4.x && v2.y == v4.y) ||
                (v3.x == v4.x && v3.y == v4.y);
    }

}